package fun_Implement

import (
	"fmt"
	"gitee.com/huanminabc/go-utils/common"
	"gitee.com/huanminabc/go-utils/encrypt"
	"gitee.com/huanminabc/go-utils/file"
	"gitee.com/huanminabc/go-utils/system"
	"go-LineScriptCommand/container"
	"go-LineScriptCommand/global"
	"go-LineScriptCommand/manager"
	"runtime"
	"strconv"
	"strings"
)

func init() {
	var funs = []container.Fun{
		_file_,
		localIp,
		localMac,
		cpuCore,
		cpuArch,
		goos,
		mem,
		diskInfo,
		validDisk,
		kill,
		processPid,
		processParentPid,
		processCmdline,
		processThreadCount,
		processCreateTime,
		processMem,
		processCwd,
		processExe,
		processUser,
		processCpuPercent,
		processMemPercent,
		processIoInfo,
		zip,
		unzip,
		tar,
		untar,
		gz,
		ungz,
	}
	common.InsertSliceBatch(&funs)
	container.RegisterFunList(funs)
	container.RegisterType("workbox", funs)
}

func localIp(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取本地ip
签名: localIp() 
示例:
1. localIp() 返回127.0.0.1 ,如果有多个网卡,那么返回多个ip\nip\nip
`
	}
	if len(args) != 0 {
		panic("localIp函数参数个数不正确")
	}
	//调用函数
	result := common.GetLocalIp()
	strs := strings.Join(result, global.LineBreak)
	return strs
}

func localMac(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取本地mac
签名: localMac() 
示例:
1. localMac() 返回00-00-00-00-00-00
`
	}
	if len(args) != 0 {
		panic("localMac函数参数个数不正确")
	}
	//调用函数
	result := common.GetLocalMac()
	return result
}

// 获取cpu几核
func cpuCore(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取cpu几核
签名: cpuCore() 
示例:
1. cpuCore() 返回 4
`
	}
	if len(args) != 0 {
		panic("cpuCore函数参数个数不正确")
	}
	//调用函数
	result := runtime.NumCPU()
	return strconv.Itoa(result)
}

// 获取cpu架构
func cpuArch(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取cpu架构
签名: cpuArch() 
示例:
1. cpuArch() 返回 amd64
`
	}
	if len(args) != 0 {
		panic("cpuArch函数参数个数不正确")
	}
	//调用函数
	return system.GetCpuArch()
}

// 获取操作系统
func goos(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取操作系统
签名: goos() 
示例:
1. goos() 返回 windows
`
	}
	if len(args) != 0 {
		panic("os函数参数个数不正确")
	}
	//调用函数
	return system.GetOs()
}

// 获取可用内存(MB)
func mem(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取可用内存(MB)
签名: mem() 
示例:
1. mem() 返回 1024
`
	}
	if len(args) != 0 {
		panic("mem函数参数个数不正确")
	}
	getMem := system.GetMem()
	return strconv.FormatUint(getMem, 10)
}

// 获取本地指定磁盘的使用情况
func diskInfo(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取本地指定磁盘的使用情况
签名: diskInfo(path) (uint64, uint64, uint64, float64, string)
- path: 磁盘路径 , 如: "c:"(windows), "/"(linux)
返回值: 总容量, 已使用容量, 可用容量, 使用率, 文件系统类型(可能为空)  (单位: MB)
示例:
1. diskInfo('c:') 返回 1024, 512, 512, 50.0, NTFS
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 1 {
		panic("diskInfo函数参数个数不正确")
	}
	path := args[0]
	total, used, free, usedPercent, fstype := system.GetDiskInfo(path)
	return strconv.FormatUint(total, 10) + global.LineBreak + strconv.FormatUint(used, 10) + global.LineBreak + strconv.FormatUint(free, 10) + global.LineBreak + strconv.FormatFloat(usedPercent, 'f', -1, 64) + global.LineBreak + fstype
}

// 获取有效的磁盘, 返回磁盘挂载点
func validDisk(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取有效的磁盘, 返回磁盘挂载点
签名: validDisk()
示例:
1. validDisk() 返回 c:\n d:\n e:\
`
	}
	if len(args) != 0 {
		panic("validDisk函数参数个数不正确")
	}
	result := system.GetValidDisk()
	return strings.Join(result, global.LineBreak)
}

// 杀死进程
func kill(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 杀死进程
签名: kill(pid)
- pid: 进程id
示例:
1. kill(1234) 返回 true
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 1 {
		panic("kill函数参数个数不正确")
	}
	pid := args[0]
	atoi, err := strconv.ParseInt(pid, 10, 32)
	if err != nil {
		panic("kill函数参数pid不是数字")
	}
	//调用函数
	err = system.KillPid(int32(atoi))
	if err != nil {
		panic(err)
	}
	return "true"
}

// 获取指定应用的进程pid
func processPid(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取指定应用的进程pid
签名: processPid(name)
- name: 进程名称
示例:
1. processPid('java') 返回 1234\n1235\n1236
2. 为啥会有多个pid呢? 因为一个应用可能启动了多个子进程
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 1 {
		panic("processPid函数参数个数不正确")
	}
	name := args[0]
	pids := system.GetPid(name)
	return strings.Trim(strings.Join(strings.Fields(fmt.Sprint(pids)), global.LineBreak), "[]")
}

// 获取进程的命令行参数
func processCmdline(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取进程的命令行参数
签名: processCmdline(pid)
- pid: 进程id
示例:
1. processCmdline(1234) 返回 java -jar xxx.jar
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	//参数个数不正确
	if len(args) != 1 {
		panic("processCmdline函数参数个数不正确")
	}
	pid := args[0]
	atoi, err := strconv.ParseInt(pid, 10, 32)
	if err != nil {
		panic("processCmdline函数参数pid不是数字")
	}
	//调用函数
	result := system.GetProcessCmdline(int32(atoi))
	return fmt.Sprintf("%d -> %s", atoi, result)
}

// 获取进程的线程数
func processThreadCount(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取进程的线程数
签名: processThreadCount(pid)
- pid: 进程id
示例:
1. processThreadCount(1234) 返回 4
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	//参数个数不正确
	if len(args) != 1 {
		panic("processThreadCount函数参数个数不正确")
	}
	pid := args[0]
	atoi, err := strconv.ParseInt(pid, 10, 32)
	if err != nil {
		panic("processThreadCount函数参数pid不是数字")
	}
	//调用函数
	result := system.GetProcessThreadCount(int32(atoi))
	return strconv.FormatInt(int64(result), 10)
}

// 获取进程的父进程pid
func processParentPid(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取进程的父进程pid  
签名: processParentPid(pid)
- pid: 进程id
示例:
1. processParentPid(1234) 返回 1111
2. 尽量不要使用这个函数,因为就算拿到了父进程的pid,也不一定能操控父进程会报错或不存在
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	//参数个数不正确
	if len(args) != 1 {
		panic("processParentPid函数参数个数不正确")
	}
	pid := args[0]
	atoi, err := strconv.ParseInt(pid, 10, 32)
	if err != nil {
		panic("processParentPid函数参数pid不是数字")
	}
	//调用函数
	result := system.GetProcessParent(int32(atoi))
	return strconv.FormatInt(int64(result), 10)
}

// 获取进程的创建时间
func processCreateTime(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取进程的创建时间
签名: processCreateTime(pid)
- pid: 进程id
示例:
1. processCreateTime(1234) 返回 2020-01-01 12:00:00
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	//参数个数不正确
	if len(args) != 1 {
		panic("processCreateTime函数参数个数不正确")
	}
	pid := args[0]
	atoi, err := strconv.ParseInt(pid, 10, 32)
	if err != nil {
		panic("processCreateTime函数参数pid不是数字")
	}
	//调用函数
	result := system.GetProcessCreateTime(int32(atoi))
	return common.Format(result, common.YYYY_MM_DD_HH_MM_SS)

}

// 通过pid获取进程占用内存信息 (单位: MB)
func processMem(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 通过pid获取进程占用内存信息 (单位: MB)
签名: processMem(pid)
- pid: 进程id
示例:
1. processMem(1234) 返回 1024
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	//参数个数不正确
	if len(args) != 1 {
		panic("processMem函数参数个数不正确")
	}
	pid := args[0]
	atoi, err := strconv.ParseInt(pid, 10, 32)
	if err != nil {
		panic("processMem函数参数pid不是数字")
	}
	//调用函数
	result := system.GetProcessRSS(int32(atoi))
	return strconv.FormatUint(result, 10)
}

// 获取进程的工作目录
func processCwd(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取进程的工作目录
签名: processCwd(pid)
- pid: 进程id
示例:
1. processCwd(1234) 返回 /tmp
2. 进程的工作目录是运行进程时候的目录,如果是依托环境变量启动的,那么这个目录不等于processExe
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	//参数个数不正确
	if len(args) != 1 {
		panic("processCwd函数参数个数不正确")
	}
	pid := args[0]
	atoi, err := strconv.ParseInt(pid, 10, 32)
	if err != nil {
		panic("processCwd函数参数pid不是数字")
	}
	//调用函数
	result := system.GetProcessCwd(int32(atoi))
	return result
}

// 获取进程可执行文件路径
func processExe(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取进程可执行文件路径
签名: processExe(pid)
- pid: 进程id
示例:
1. processExe(1234) 返回 /usr/bin/java
2. 可执行文件路径是exe所在的路径
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	//参数个数不正确
	if len(args) != 1 {
		panic("processExe函数参数个数不正确")
	}
	pid := args[0]
	atoi, err := strconv.ParseInt(pid, 10, 32)
	if err != nil {
		panic("processExe函数参数pid不是数字")
	}
	//调用函数
	result := system.GetProcessExe(int32(atoi))
	return result
}

// 获取进程的用户名
func processUser(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取进程的用户名
签名: processUser(pid)
- pid: 进程id
示例:
1. processUser(1234) 返回 root
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	//参数个数不正确
	if len(args) != 1 {
		panic("processUser函数参数个数不正确")
	}
	pid := args[0]
	atoi, err := strconv.ParseInt(pid, 10, 32)
	if err != nil {
		panic("processUser函数参数pid不是数字")
	}
	//调用函数
	result := system.GetProcessUsername(int32(atoi))
	return result
}

// 获取进程的cpu占用率
func processCpuPercent(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取进程的cpu占用率
签名: processCpuPercent(pid)
- pid: 进程id
示例:
1. processCpuPercent(1234) 返回 30.1251321
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	//参数个数不正确
	if len(args) != 1 {
		panic("processCpuPercent函数参数个数不正确")
	}
	pid := args[0]
	atoi, err := strconv.ParseInt(pid, 10, 32)
	if err != nil {
		panic("processCpuPercent函数参数pid不是数字")
	}
	//调用函数
	result := system.GetProcessCpuPercent(int32(atoi))
	return strconv.FormatFloat(result, 'f', -1, 64)
}

// 获取进程的内存占用率
func processMemPercent(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取进程的内存占用率
签名: processMemPercent(pid)
- pid: 进程id
示例:
1. processMemPercent(1234) 返回 30.1251321
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	//参数个数不正确
	if len(args) != 1 {
		panic("processMemPercent函数参数个数不正确")
	}
	pid := args[0]
	atoi, err := strconv.ParseInt(pid, 10, 32)
	if err != nil {
		panic("processMemPercent函数参数pid不是数字")
	}
	//调用函数
	result := system.GetProcessMemPercent(int32(atoi))
	return strconv.FormatFloat(float64(result), 'f', -1, 64)
}

// 获取进程的io信息
func processIoInfo(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 获取进程的io信息
签名: processIoInfo(pid)
- pid: 进程id
返回值: 从启动到现在累积的 读取次数, 写入次数,读取字节数, 写入字节数  (单位: MB)
示例:
1. processIoInfo(1234) 返回 1024, 2048, 2048, 1024
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 1 {
		panic("processIoInfo函数参数个数不正确")
	}
	pid := args[0]
	atoi, err := strconv.ParseInt(pid, 10, 32)
	if err != nil {
		panic("processIoInfo函数参数pid不是数字")
	}
	//调用函数
	readCount, writeCount, readBytes, writeBytes := system.GetProcessIoInfo(int32(atoi))
	return strconv.FormatUint(readBytes, 10) + global.LineBreak + strconv.FormatUint(writeBytes, 10) + global.LineBreak + strconv.FormatUint(readCount, 10) + global.LineBreak + strconv.FormatUint(writeCount, 10)
}

func _file_(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 文件处理(读,编辑,监听)
签名: file(文件路径,options,options1,options2)
- 文件路径: 文件路径
- options: 选项
说明: 啥也不传就是打印所有行,编辑e和监听f只能选择一个
- e: 编辑文件(所有的编辑动作都会输出最新的全部内容)
- - h1:显示文件头部1行,h2:显示文件头部2行
- - t1:显示文件尾部1行,t2:显示文件尾部2行
- - g1:显示文件第1行,g2:显示文件第2行
- - g1-2:显示文件第1行到第2行
- - addh:在文件头部添加内容,例如:addh hello  
- - addt:在文件尾部添加内容,例如:addt hello
- - add1 行内容:在文件第1行的下面插入新内容,例如:add1 hello
- - cover1 行内容:在文件第1行覆盖新内容,例如:cover1 hello
- - del1:删除文件第1行,例如:del1
- - del1-2:删除文件第1行到第2行,例如:del1-2
- - rep /内容/新内容/:替换文件所有的内容,例如:rep /hello/world/
- - rep1 /内容/新内容/:替换文件第1行的内容,例如:rep1 /hello/world/
- f: 开启文件监听器(下面操作都需要在监听器中操作)
- - h: 显示帮助
- - /:搜索 例如:/hello
- - u:上一个搜索
- - n:下一个搜索
- - q:恢复监控
- - w:向上翻
- - s:向下翻
- - w: 向上翻页
- - s: 向下翻页
- - p(x):设置翻页行数(默认10行) 例如:p20,如果是pn就显示所有行
- - exit: 退出
- - clean:清屏
- - status: 查看状态
提示:
1.监控缓存最多存储10万行,超过10万行会删除前面的行
2.任何操作都会导致文件监听暂停,可以通过q恢复监听
示例: 
1. file('test.txt') 返回值为 文件所有行
2. file('test.txt',e,addt,'xxxx') 在文件尾部添加xxxx
2. file('test.txt',e,h1) 返回值为 编辑文件头部1行
3. file('test.txt',f) 开启文件监听器,之后的操作都需要在监听器中操作
4. test2.txt|file 读取全部内容
第二个参数为e的时候参数个数必须是3个,为f的时候参数个数必须是2个
如果是在f监听文件模式下,那么file函数后面的管道会随着每次文件增量变化而执行
比如: test2.txt|file(f)|grep('hello')  那么每次test.txt文件有增量变化,那么grep函数就会执行

`
	}
	//如果管道有值,那么就将前一个管道的值给函数第一个
	if container.GetPrePipelineData().Data != "" {
		filePre := container.GetPrePipelineData().Data
		if !file.IsExist(filePre) {
			panic("file函数参数不正确,文件不存在:" + filePre)
		}
		container.GetPrePipelineDataAndData(&args)
	}
	//判断是否就一个参数.那么就默认打印所有行
	if len(args) == 1 {
		filePath := args[0]
		viewer := file.NewFileViewer(filePath, false, "")
		viewer.SetEditPrintOff(false) //设置编辑不打印
		start := viewer.Start()
		//将处理后的数据放入到管道中给下一个管道使用
		return strings.Join(start, global.LineBreak)
	}

	//判断第2个参数是否是e或者f
	if len(args) >= 2 && args[1] != "e" && args[1] != "f" {
		panic("file函数参数个数不正确,第2个参数必须是e或者f")
	}
	//拆分参数
	filePath := args[0]
	option := args[1]
	//判断文件是否存在
	if !file.IsExist(filePath) {
		panic("file函数参数不正确,文件不存在:" + filePath)
	}

	//判断是否是编辑
	if option == "e" {
		//判断参数个数必须是3个
		if len(args) < 3 {
			panic("file函数参数个数不正确,e模式最少3个参数")
		}
		option1 := ""
		//判断长度是否是3
		if len(args) >= 3 {
			option1 = args[2]
		}
		//针对rep定制
		if strings.HasPrefix(args[2], "rep") {
			var rep = "/" + args[3] + "/" + args[4] + "/"
			option1 += " " + rep
		} else {
			//判断长度是否是4
			if len(args) >= 4 {
				option1 += " " + args[3]
			}
		}

		viewer := file.NewFileViewer(filePath, false, option1)
		viewer.SetEditPrintOff(false) //设置编辑不打印
		start := viewer.Start()
		//将处理后的数据放入到管道中给下一个管道使用
		return strings.Join(start, global.LineBreak)
	} else if option == "f" {
		//判断参数个数必须是2个
		if len(args) != 2 {
			panic("file函数参数个数不正确,f模式最少2个参数")
		}
		//截取管道执行计划取file之后的管道
		pipe := global.ExpressionPipe
		//分割管道
		pipeSlice := strings.Split(pipe, "|")
		//遍历每个管道判断前缀是否是file
		for i, v := range pipeSlice {
			if strings.HasPrefix(v, "file") {
				//截取file之后的管道
				pipeSlice = pipeSlice[i+1:]
				break
			}
		}
		viewer := file.NewFileViewer(filePath, true, "")
		//如果是file之后没有管道那么就不加函数
		if len(pipeSlice) != 0 {
			viewer.AddMonitorFunc(func(string []string) {
				defer func() {
					if err := recover(); err != nil {
						fmt.Println(err)
					}
				}()
				container.ClearPipelineData() //清理管道数据
				//将增量数据放入到管道中
				var strParam strings.Builder
				for _, v := range string {
					v = manager.LineBreakReplace(v)
					//如果是空行,那么就不加入
					if v == "" {
						continue
					}
					strParam.WriteString(v + global.LineBreak)
				}
				//去掉最后一个换行符
				parm := strings.TrimRight(strParam.String(), global.LineBreak)
				data := container.NewPipelineData(parm)
				container.RegisterPipelineData(data)
				//执行管道
				manager.CoreExecute(strings.Join(pipeSlice, "|"))
			})
		}
		viewer.Start()
		global.StopPipe = true //停止管道继续执行
	} else {
		panic("file函数参数不正确")
	}

	return ""
}

func zip(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 压缩文件或文件夹
签名: zip(src, dst)
- src: 源文件或文件夹路径
- dst: 目标文件路径
示例:
1. zip('F:\\test\\111.jpg', 'F:\\b.zip') 
2. zip('F:\\test', 'F:\\b.zip')
`
	}
	//如果管道有值,那么就将前一个管道的值给函数第一个
	if len(args) == 1 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 2 {
		panic("zip函数参数个数不正确")
	}
	src := args[0]
	dst := args[1]
	err := file.Zip(src, dst)
	if err != nil {
		panic(err)
	}
	return "true"
}
func unzip(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 解压文件
签名: unzip(src,dst )
- src: 源文件路径
- dst: 目标文件夹路径
示例:
1. unzip('F:\\test\\a.zip', 'F:\\test')
`
	}
	//如果管道有值,那么就将前一个管道的值给函数第一个
	if len(args) == 1 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 2 {
		panic("unzip函数参数个数不正确")
	}
	src := args[0]
	dst := args[1]
	err := file.UnZip(dst, src)
	if err != nil {
		panic(err)
	}
	return "true"
}

func tar(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 压缩文件或文件夹
签名: tar(src, dst)
- src: 源文件或文件夹路径
- dst: 目标文件路径
示例:
1. tar('F:\\test\\111.jpg', 'F:\\b.tar.gz')
2. tar('F:\\test', 'F:\\b.tar.gz')
`
	}
	//如果管道有值,那么就将前一个管道的值给函数第一个
	if len(args) == 1 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 2 {
		panic("tar函数参数个数不正确")
	}
	src := args[0]
	dst := args[1]
	err := file.Tar(src, dst)
	if err != nil {
		panic(err)
	}
	return "true"
}
func untar(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 解压文件
签名: untar(src,dst )
- src: 源文件路径
- dst: 目标文件夹路径
示例:
1. untar('F:\\test\\a.tar.gz', 'F:\\test')
`
	}
	//如果管道有值,那么就将前一个管道的值给函数第一个
	if len(args) == 1 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 2 {
		panic("untar函数参数个数不正确")
	}
	src := args[0]
	dst := args[1]
	err := file.UnTar(dst, src)
	if err != nil {
		panic(err)
	}
	return "true"
}
func gz(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 压缩文件
签名: gz(src, dst)
- src: 源文件路径
- dst: 目标文件路径
示例:
1. gz('F:\\test\\111.jpg', 'F:\\b.gz')
`
	}
	if len(args) == 1 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 2 {
		panic("gz函数参数个数不正确")
	}
	src := args[0]
	dst := args[1]
	file.GzipFile(src, dst)
	return "true"
}
func ungz(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: 解压文件
签名: ungz(src, dst)
- src: 源文件路径
- dst: 目标文件路径
示例:
1. ungz('F:\\test\\111.gz', 'F:\\b.jpg')
`
	}
	if len(args) == 1 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 2 {
		panic("ungz函数参数个数不正确")
	}
	src := args[0]
	dst := args[1]
	file.UnGzipPath(src, dst)
	return "true"
}

func base64Encode(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: base64编码
签名: base64Encode(str)
- str: 字符串
示例:
1. base64Encode('hello') 返回 aGVsbG8=
`
	}
	//如果管道有值,那么就将前一个管道的值给函数第一个
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 1 {
		panic("base64Encode函数参数个数不正确")
	}
	str := args[0]
	return encrypt.Base64StrEncode(str)
}

func base64Decode(args ...string) string {
	if len(args) > 0 && args[0] == "-doc" {
		return `
功能: base64解码
签名: base64Decode(str)
- str: 字符串
示例:
1. base64Decode('aGVsbG8=') 返回 hello
`
	}
	if len(args) == 0 && container.GetPrePipelineData().Data != "" {
		container.GetPrePipelineDataAndData(&args)
	}
	if len(args) != 1 {
		panic("base64Decode函数参数个数不正确")
	}
	str := args[0]
	return encrypt.Base64StrDecode(str)
}
